home *** CD-ROM | disk | FTP | other *** search
- /*====================================================
- ARTemis
- (version 1.3)
- FM-TOWNS 用ペイントツール
-
- by 松内 良介 1994
- ====================================================*/
- /*
- guisub.c
- 拡張ライブラリII をもっとラクに使うための補助関数群
-
- 兄弟ウィンドウ関係の取得/設定
- ウィンドウのユーザー枠の座標を得る
- 描画原点を(0,0)に設定/復帰
- クリップ/ビジブル領域を画面全体に設定/復帰
- 12ドット文字表示
-
- int RM_init(void)
- void RM_end(void)
-
- void RM_getHyper(int objId, HYPER *hyp)
- void RM_getFrame(int idObj, FRAME *fr)
- void RM_setHyper(int objId, HYPER *hyp)
- void RM_setFrame(int objId, FRAME *fr);
- void RM_offsetFrame(int id, int dx,int dy);
- void RM_setChColor(int objId, int col)
- void RM_moveCenter(int objId)
- void RM_getMoveFrame(FRAME *fr)
-
- void RM_getWinUserFrame(int id, FRAME *user)
-
- void RM_raise(int kobj)
- int RM_isTopInBros(int kobj)
-
- void RM_setOriginZero(void)
- void RM_recoverOrigin(void)
- void RM_setClipVisibleAllScr(void)
- void RM_setClipAnyFrame(int id, FRAME *fr)
- void RM_recoverClipVisible(void)
-
- void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
- void RM_adjustWinUser(int idWin, FRAME *parm)
-
- int RM_callSimpleFDG(int baseId, int noselId,
- char *title,char *ok,char *cancel,
- char *wildext, int flag, char *pathbuf)
- void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
-
- void RM_putstring12(char *egbwork, int x,int y, char *str,
- int col, int bold)
- void RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
- void RM_setScrollPos(int idSBar, int nPos, int bRedraw)
- int RM_getScrollPos(int idSBar)
- void RM_setClipWinUser(int idWin, WINCLIP **clipstack)
- void RM_resetClipWinUser(WINCLIP *clipstack)
- void RM_roundFramePosition(int idWin, int nx, int ny)
- void RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
- void RM_pushRadioButton(int idBtn,int idBase,
- int *idBtnAry, int btnNum, int *sel)
- void RM_setMosCsr(int colorMode, int csrType)
-
- void RM_setFileDlgStyle(int style)
-
- void RM_setNumBoxValue(int id, int n, int bRedraw);
- int RM_getNumBoxValue(int id);
-
- void RM_getScreenSize(int *wid, int *ht);
-
-
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <winb.h>
- #include <te.h>
- #include <fntb.h>
- #include <gui.h>
- #include <file_dlg.h>
- #include <ctype.h>
- #include <fnt.h>
-
- #include <egb.h>
- #include <wgb.h>
- #include <msdos.cf>
-
- #include "guisub.h"
- #include "egbmac.h"
- #include "wgbmac.h"
-
- #define _iskanji(c) (((c)&0xff) >= 0x81 && ((c)&0xff)<=0x9f || \
- ((c)&0xff) >= 0xe0 && ((c)&0xff)<=0xfc)
- #define _iskanji1(kcode) ((((kcode)>>8)&0xff) <= 0x97)
-
- #define WHITE 15
- #define BLACK 8
- #define WINBACK 6
- #define RED 10
- #define GRAY 7
-
- /*--------------------------------------------------------*/
- /* このモジュールの初期化 */
- /*--------------------------------------------------------*/
-
- static int font12seg; // 12dot font が存在するセグメント
-
- int RM_init(void)
- {
- extern int mma_allocSeg(char* segname);
- font12seg = mma_allocSeg("FONT");
- return 0;
- }
-
- void RM_end(void)
- {
- }
-
- /*--------------------------------------------------------*/
- /* ハイパー/枠の設定・取得 */
- /*--------------------------------------------------------*/
-
- void RM_getHyper(int objId, HYPER *hyp)
- {
- MMI_SendMessage(objId, MM_GETHYPER, 1, hyp);
- }
-
- void RM_getFrame(int idObj, FRAME *fr)
- {
- HYPER hyp;
- MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
- *fr = hyp.fr;
- }
-
- void RM_setHyper(int objId, HYPER *hyp)
- {
- MMI_SendMessage(objId, MM_SETHYPER, 1, hyp);
- }
-
- void RM_setFrame(int id, FRAME *fr)
- {
- HYPER hyp;
- MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
- hyp.fr = *fr;
- MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
- }
-
- void RM_offsetFrame(int id,int dx,int dy)
- {
- HYPER hyp;
- MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
- hyp.fr.lupx += dx;
- hyp.fr.lupy += dy;
- hyp.fr.rdwx += dx;
- hyp.fr.rdwy += dy;
- MMI_SendMessage(id, MM_SETHYPER, 1, &hyp);
- }
-
- void RM_setChColor(int idObj, int col)
- {
- HYPER hyp;
- MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
- hyp.clr.ch = col;
- MMI_SendMessage(idObj, MM_SETHYPER, 1, &hyp);
- }
-
- void RM_moveCenter(int objId)
- {
- HYPER h;
- FRAME fr,frScr;
- WINCTRL *pCtrl;
- int wid,ht;
- MMI_GetControl(&pCtrl);
- frScr = pCtrl->bound;
- MMI_SendMessage(objId, MM_GETHYPER, 1, &h);
- wid = h.fr.rdwx - h.fr.lupx + 1;
- ht = h.fr.rdwy - h.fr.lupy + 1;
- fr.lupx = ((frScr.rdwx - frScr.lupx+1) - wid) / 2;
- fr.lupy = ((frScr.rdwy - frScr.lupy+1) - ht ) / 2;
- fr.rdwx = fr.lupx + wid - 1;
- fr.rdwy = fr.lupy + ht - 1;
- MMI_SendMessage(objId, MM_MOVE, 1, &fr);
- }
-
- void RM_getMoveFrame(FRAME *fr)
- {
- WINCTRL *ctrl;
- MMI_GetControl(&ctrl);
- if (fr != NULL)
- *fr = ctrl->move;
- }
-
- /*--------------------------------------------------------*/
- /* 兄弟ウィンドウ関係の取得/設定 */
- /*--------------------------------------------------------*/
-
- void RM_raise(int kobj)
- /* 兄弟ウィンドウ内で一番上にもってくる */
- {
- int base;
- base = TL_getObjectPtr(kobj)->base;
- if (base < 0)
- return;
- MMI_SendMessage(kobj, MM_DETACH, 0);
- MMI_SendMessage(kobj, MM_ATTACH, 2, base, -1) ;
- }
-
- int RM_isTopInBros(int kobj)
- /* 兄弟ウィンドウ内で一番上かどうかを調べる */
- {
- OBJECT *pobj,*pbase;
- pobj = TL_getObjectPtr(kobj);
- pbase = TL_getObjectPtr(pobj->base);
- if (pbase->slave == pobj->llevel)
- return 1;
- else
- return 0;
- }
-
- /*--------------------------------------------------------*/
- /* ウィンドウのユーザー枠の座標を得る */
- /*--------------------------------------------------------*/
-
- void RM_getWinUserFrame(int id, FRAME *user)
- {
- HYPER hyp;
- FRAME frUser,frResize;
- MMI_SendMessage(id, MM_GETUSER, 2, &frUser, &frResize);
- MMI_SendMessage(id, MM_GETHYPER, 1, &hyp);
- frUser.lupx += hyp.fr.lupx;
- frUser.lupy += hyp.fr.lupy;
- frUser.rdwx = frUser.lupx + frUser.rdwx - 1;
- frUser.rdwy = frUser.lupy + frUser.rdwy - 1;
- if (user != NULL)
- *user = frUser;
- }
-
- /*--------------------------------------------------------*/
- /* 描画原点を(0,0)に設定/復帰 */
- /*--------------------------------------------------------*/
-
- typedef struct stag_orig {
- struct stag_orig *next;
- POINT ptOrigStack;
- } ORIGSTACK;
-
- static ORIGSTACK *ostack = NULL;
-
- void RM_setOriginZero(void)
- {
- static POINT ptNewOrig = {0,0};
- ORIGSTACK *pos;
- pos = TL_calloc(1, sizeof(ORIGSTACK));
- pos->next = ostack;
- ostack = pos;
- MG_PushOrigin(&ptNewOrig, &pos->ptOrigStack);
- }
-
- void RM_recoverOrigin(void)
- {
- ORIGSTACK *pos;
- pos = ostack;
- ostack = ostack->next;
- MG_PopOrigin(&pos->ptOrigStack);
- TL_free(pos);
- }
-
- /*--------------------------------------------------------*/
- /* クリップ/ビジブル領域を画面全体に設定/復帰 */
- /*--------------------------------------------------------*/
-
- typedef struct _tag_cvstack {
- struct _tag_cvstack *next;
- WINCLIP *pwcClipStack;
- WINCLIP *pwcVisibleStack;
- int type;
- } CVSTACK;
-
- #define STACK_PUSHCLIP 0
- #define STACK_BEGINUPDATE 1
-
- static CVSTACK *cvstack = NULL;
-
- void RM_setClipVisibleAllScr(void)
- {
- CVSTACK *pcv;
- FRAME frAllScr;
- WINCLIP *pWinClip;
- WINCTRL *pWinCtrl;
- /* 画面全体を表す WINCLIP リストを作成 */
- MMI_GetControl(&pWinCtrl);
- frAllScr = pWinCtrl->bound;
- pWinClip = WIN_getClipMemory(&frAllScr, NULL);
- /* CVSTACKを作成、リストに追加 */
- pcv = TL_calloc(1, sizeof(CVSTACK));
- pcv->next = cvstack;
- cvstack = pcv;
- /* pWinClip をクリップ領域・ビジブル領域として設定 */
- WIN_pushVisible(WIN_copyClip(pWinClip), &(pcv->pwcVisibleStack));
- WIN_pushClip(pWinClip, &(pcv->pwcClipStack));
- pcv->type = STACK_PUSHCLIP;
- }
-
- void RM_setClipAnyFrame(int id, FRAME *fr)
- {
- CVSTACK *pcv;
- /* CVSTACKを作成、リストに追加 */
- pcv = TL_calloc(1, sizeof(CVSTACK));
- pcv->next = cvstack;
- cvstack = pcv;
- /* クリップ領域を設定 */
- pcv->pwcVisibleStack = NULL;
- HYPER hyp;
- FRAME frBackup;
- RM_getHyper(id, &hyp);
- frBackup = hyp.fr;
- hyp.fr = *fr;
- RM_setHyper(id, &hyp);
- WIN_beginUpDateObj(id, &(pcv->pwcClipStack));
- hyp.fr = frBackup;
- RM_setHyper(id, &hyp);
- pcv->type = STACK_BEGINUPDATE;
- }
-
- void RM_recoverClipVisible(void)
- {
- CVSTACK *pcv;
- pcv = cvstack;
- cvstack = cvstack->next;
- if (pcv->type == STACK_PUSHCLIP)
- {
- if (pcv->pwcClipStack != NULL)
- WIN_popClip(pcv->pwcClipStack);
- if (pcv->pwcVisibleStack != NULL)
- WIN_popVisible(pcv->pwcVisibleStack);
- }
- else if (pcv->type == STACK_BEGINUPDATE)
- {
- if (pcv->pwcClipStack != NULL)
- WIN_endUpDateObj(pcv->pwcClipStack);
- if (pcv->pwcVisibleStack != NULL)
- WIN_popVisible(pcv->pwcVisibleStack);
- }
- TL_free(pcv);
- }
-
- /*--------------------------------------------------------*/
- /* 他の部品をベースに部品の位置・大きさを設定 */
- /*--------------------------------------------------------*/
-
- void RM_adjustFrame(int kobj, int baseobj, FRAME *parm)
- {
- HYPER hyp, hypBase;
- MMI_SendMessage(kobj, MM_GETHYPER, 1, &hyp);
- MMI_SendMessage(baseobj, MM_GETHYPER, 1, &hypBase);
- #define DO(t1, t2, t3) \
- if (parm->t1 >= 0) \
- hyp.fr.t1 = hypBase.fr.t2 + parm->t1; \
- else \
- hyp.fr.t1 = hypBase.fr.t3 + 1 + parm->t1;
- DO(lupx, lupx, rdwx)
- DO(lupy, lupy, rdwy)
- DO(rdwx, lupx, rdwx)
- DO(rdwy, lupy, rdwy)
- #undef DO
- MMI_SendMessage(kobj, MM_SETHYPER, 1, &hyp);
- }
-
- void RM_adjustWinUser(int idWin, FRAME *parm)
- {
- HYPER hyp;
- FRAME frUser, frResize;
- MMI_SendMessage(idWin, MM_GETHYPER, 1, &hyp);
- MMI_SendMessage(idWin, MM_GETUSER, 2, &frUser, &frResize);
- #define DO(t1, t2, t3) \
- if (parm->t1 >= 0) \
- frUser.t1 = hyp.fr.t2 + parm->t1; \
- else \
- frUser.t1 = hyp.fr.t3 + 1 + parm->t1;
- DO(lupx, lupx, rdwx)
- DO(lupy, lupy, rdwy)
- DO(rdwx, lupx, rdwx)
- DO(rdwy, lupy, rdwy)
- #undef DO
- frUser.rdwx = frUser.rdwx - frUser.lupx + 1;
- frUser.rdwy = frUser.rdwy - frUser.lupy + 1;
- frUser.lupx = frUser.lupx - hyp.fr.lupx;
- frUser.lupy = frUser.lupy - hyp.fr.lupy;
- MMI_SendMessage(idWin, MM_SETUSER, 1, &frUser, &frResize);
- }
-
- /*--------------------------------------------------------*/
- /* ファイルダイアログの呼び出し */
- /*--------------------------------------------------------*/
-
- int RM_callSimpleFDG(int baseId, int noselId, char *title,
- char *ok, char *cancel, char *wildext, int flag,
- char *init_pathname,
- char *res_pathbuf)
- /*
- flag: FDG_NONE, FDG_MSLCT, FDG_TEXT, FDG_FILEONLY など
- FDG_MSLCT を指定している場合、*(int*)pathbuf にファイルの個数
- (返値が0でないときは無効)
- */
- {
- int atr,ret,i;
- // ワイルドカード指定情報の作成
- static char *extstr[] = {"*.*",NULL};
- if (wildext != NULL)
- extstr[0] = wildext;
- else
- extstr[0] = "*.*";
- // ファイルダイアログ以外の部品を選択不可にする
- MTL_setFlagObj(noselId, MS_UNSELECT) ;
- // タイトル、表示位置を設定
- FDG_SetTitle(title, ok, cancel) ;
- HYPER h;
- FRAME fr;
- MMI_SendMessage(FDG_GetMainID(), MM_GETHYPER, 1, &h);
- int scrwid,scrht; RM_getScreenSize(&scrwid,&scrht);
- fr.lupx = (scrwid - (h.fr.rdwx - h.fr.lupx + 1)) / 2;
- fr.lupy = (scrht - (h.fr.rdwy - h.fr.lupy + 1)) / 2;
- FDG_SetFrame(fr);
- // 最初のファイル名文字列を設定
- char init_dir[_MAX_DRIVE+_MAX_DIR];
- char init_fname[_MAX_FNAME+_MAX_EXT];
- if (init_pathname == NULL)
- init_dir[0] = 0, init_fname[0] = 0;
- else
- {
- char drive[_MAX_DRIVE], dir[_MAX_DIR];
- char basename[_MAX_FNAME], ext[_MAX_EXT];
- _splitpath(init_pathname, drive,dir,basename,ext);
- strcpy(init_dir, drive);
- strcat(init_dir, dir);
- strcpy(init_fname, basename);
- strcat(init_fname, ext);
- }
- if (init_dir[0] != 0)
- {
- char ch = init_dir[strlen(init_dir)-1];
- if (ch == ':')
- strcat(init_dir, ".");
- else if (ch == '\\')
- init_dir[strlen(init_dir)-1] = 0;
- }
- // 初期テキストフィールドを設定
- FDG_SetFileText(" ");
- if (init_fname[0] != 0)
- FDG_SetFileText(init_fname);
- else
- FDG_SetFileText("");
- // ダイアログ呼び出し
- unsigned int select_cnt;
- ret = FDG_DspFileDlg(baseId, flag, (init_dir[0]!=0 ? init_dir:NULL),
- extstr,&select_cnt);
- // 「実行」が押されたならファイル名を取得
- if (ret > 0)
- {
- if (flag & FDG_MSLCT)
- *(int*)res_pathbuf = select_cnt;
- else
- {
- char pathname[_MAX_PATH];
- FDG_GetPathName(pathname, &atr, 0);
- strcpy(res_pathbuf, pathname);
- }
- }
- // ファイルダイアログ以外の部品を選択可能にもどす
- MTL_resetFlagObj(noselId, ~MS_UNSELECT) ;
- // リターン
- if (ret > 0)
- return 0;
- else
- return -1;
- }
-
- /*--------------------------------------------------------*/
- /* 12ドット文字表示 */
- /*--------------------------------------------------------*/
-
- void RM_putstring12(char *egbwork,int x,int y,char *str, int col,int bold)
- /* グローバル変数 font12seg の設定が必要 */
- {
- #define PUTBITBLOCK(x1,y1,x2,y2,dat) { \
- char para[16]; \
- DWORD(para)=(unsigned int)dat; WORD(para+4)=getds(); \
- WORD(para+6)=x1; WORD(para+8)=y1; \
- WORD(para+10)=x2; WORD(para+12)=y2; \
- WGB_putBlockColor(egbwork, 1, para); }
- int ds = getds();
- char fontbuf[24];
- EGB_color(egbwork, 0, col);
- EGB_writeMode(egbwork, 0);
- while (*str != 0)
- {
- if (_iskanji(*str))
- /* 全角文字の場合 */
- {
- int ofs, sjis = (*str)*256 + *(str+1), jis;
- jis = FNT_sjisToJis(sjis);
- if (_iskanji1(sjis))
- {
- ofs = ( ((jis>>8)-0x21)*94 + (jis&0xff) - 0x21)*24 + 0xc00;
- _movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 24);
- }
- else // 第1水準じゃない場合
- {
- char font16buf[32];
- FNT_kanjiRead(16,16,jis,ds,font16buf);
- memset(fontbuf,0,24);
- int di=0;
- for (int i=0; i<16; i++)
- {
- unsigned short p;
- p = ((unsigned short)font16buf[i*2]<<8) |
- font16buf[i*2+1];
- p = (p&0xc000) | ((p&0x3c00)<<1) | ((p&0x3c0)<<2) |
- ((p&0x3c)<<3) | ((p&0x3)<<4);
- fontbuf[di*2] |= (p>>8) & 0xff;
- fontbuf[di*2+1] |= p & 0xff;
- if (i!=1 && i!=4 && i!=7 && i!=10)
- di++;
- }
- }
- PUTBITBLOCK(x,y,x+11,y+11,fontbuf);
- str++,str++;
- x += 12;
- }
- else
- /* ANK文字の場合 */
- {
- if (*str != ' ')
- {
- int ofs = (int)*str * 12;
- _movedata(font12seg, ofs, ds, (unsigned int)fontbuf, 12);
- PUTBITBLOCK(x,y,x+5,y+11,fontbuf);
- }
- str++;
- x += 6;
- }
- }
- }
-
- /*--------------------------------------------------------*/
- /* スクロールバー値の設定/取得 */
- /*--------------------------------------------------------*/
-
- void RM_setScrollRange(int idSBar, int nDisp, int nAll, int bRedraw)
- {
- int ptr,min,max,len,page;
- MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
- min = nDisp-1;
- max = nAll < nDisp ? nDisp-1 : nAll-1;
- ptr = _max(min, _min(max, ptr));
- MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, nDisp, page);
- if (bRedraw)
- MMI_SendMessage(idSBar, MM_SHOW, 0);
- }
-
- void RM_setScrollPos(int idSBar, int nPos, int bRedraw)
- {
- int ptr,min,max,len,page;
- MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
- ptr = _max(min, _min(max, min + nPos));
- MMI_SendMessage(idSBar, MM_SETSCROLL, 5, ptr,min,max, len, page);
- if (bRedraw)
- MMI_SendMessage(idSBar, MM_SHOW, 0);
- }
-
- int RM_getScrollPos(int idSBar)
- {
- int ptr,min,max,len,page;
- MMI_SendMessage(idSBar, MM_GETSCROLL, 5, &ptr,&min,&max,&len,&page);
- return ptr - min;
- }
-
- /*--------------------------------------------------------*/
- /* 数値入力ボックスの値の設定・取得 */
- /*--------------------------------------------------------*/
-
- void RM_setNumBoxValue(int id, int n, int bRedraw)
- {
- int var,min,max,delta,ptclm;
- MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
- MMI_SendMessage(id, MM_SETNUMBOX, 5, n,min,max,delta,ptclm);
- if (bRedraw)
- {
- WINCLIP* clip;
- WIN_beginUpDateObj(id,&clip);
- MMI_SendMessage(id,MM_SHOW,0);
- WIN_endUpDateObj(clip);
- }
- }
-
- int RM_getNumBoxValue(int id)
- {
- int var,min,max,delta,ptclm;
- MMI_SendMessage(id, MM_GETNUMBOX, 5, &var,&min,&max,&delta,&ptclm);
- return var;
- }
-
- /*--------------------------------------------------------*/
- /* ウィンドウのユーザー領域にクリップを設定 */
- /*--------------------------------------------------------*/
-
- void RM_setClipWinUser(int idWin, WINCLIP **clipstack)
- {
- HYPER hyp;
- FRAME frUser,frBackup;
- RM_getHyper(idWin, &hyp);
- frBackup = hyp.fr;
- RM_getWinUserFrame(idWin, &frUser);
- hyp.fr = frUser;
- RM_setHyper(idWin, &hyp);
- WIN_beginUpDateObj(idWin, clipstack);
- hyp.fr = frBackup;
- RM_setHyper(idWin, &hyp);
- }
-
- void RM_resetClipWinUser(WINCLIP *clipstack)
- {
- WIN_endUpDateObj(clipstack);
- }
-
- /*--------------------------------------------------------*/
- /* ウィンドウの座標を n の倍数に補正 */
- /*--------------------------------------------------------*/
-
- void RM_roundFramePosition(int idWin, int nx, int ny)
- {
- HYPER hyp;
- MG_mosDisp(2);
- RM_getHyper(idWin, &hyp);
- int dx,dy;
- dx = -(hyp.fr.lupx % nx);
- dy = -(hyp.fr.lupy % ny);
- if (dx != 0 || dy != 0)
- WIN_moveWindow(idWin, dx,dy);
- MG_mosDisp(3);
- }
-
- /*--------------------------------------------------------*/
- /* ラジオボタン処理 */
- /*--------------------------------------------------------*/
-
- void RM_initRadioButton(int *idBtnAry, int btnNum, int *sel)
- {
- int i;
- for (i=0; i<btnNum; i++)
- MTL_resetFlagObj(idBtnAry[i], ~(MS_UNSELECT|MS_TOGGLE)) ;
- // MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
- MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
- }
-
- void RM_pushRadioButton(int idBtn,int idBase,
- int *idBtnAry, int btnNum, int *sel)
- {
- WINCLIP *clip;
- int i;
- for (i=0 ; i<btnNum; i++)
- if (idBtnAry[i] == idBtn)
- break;
- if (*sel != i)
- {
- WIN_beginUpDateObj(idBase, &clip);
- // MTL_resetFlagObj(idBtnAry[*sel], ~(MS_UNSELECT|MS_TOGGLE)) ;
- MTL_resetFlagObj(idBtnAry[*sel], ~MS_TOGGLE) ;
- MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
- *sel = i;
- // MTL_setFlagObj(idBtnAry[*sel], (MS_UNSELECT|MS_TOGGLE)) ;
- MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
- WIN_endUpDateObj(clip);
- }
- else
- {
- WIN_beginUpDateObj(idBase, &clip);
- MTL_setFlagObj(idBtnAry[*sel], MS_TOGGLE) ;
- MMI_SendMessage(idBtnAry[*sel], MM_SHOW, 0) ;
- WIN_endUpDateObj(clip);
- }
- }
-
- /*--------------------------------------------------------*/
- /* マウスカーソル形状の設定 */
- /*--------------------------------------------------------*/
-
- void RM_setMosCsr(int colorMode, int csrType)
- {
- unsigned int *coltbl;
- coltbl = MG_getColorTable(colorMode);
- if (colorMode == 0)
- SetMouse16(csrType, WHITE, BLACK);
- else if (colorMode == 1)
- SetMouse16(csrType, coltbl[WHITE] & 0xff, coltbl[BLACK] & 0xff);
- else if (colorMode == 2)
- SetMouse16(csrType, coltbl[WHITE]&0x7fff, coltbl[BLACK]&0x7fff);
- }
-
- /*--------------------------------------------------------*/
- /* メタID からクラス名を得る */
- /*--------------------------------------------------------*/
-
- char *RM_getMetaIdName(int metaId)
- {
- char *typename;
- if (metaId == MJ_DIALOGL40)
- typename = "ダイアログ型";
- else if (metaId == MJ_HYPER)
- typename = "ハイパー型";
- else if (metaId == MJ_ALERTL40)
- typename = "アラート型";
- else if (metaId == MJ_WINDOWL40)
- typename = "ウィンドウ型";
- else if (metaId == MJ_MSGL40)
- typename = "メッセージ型";
- else if (metaId == MJ_MENUL40)
- typename = "メニュー型";
- else if (metaId == MJ_BUTTONL40)
- typename = "ボタン型";
- else if (metaId == MJ_DBUTTONL40)
- typename = "ドローボタン型";
- else if (metaId == MJ_ICONL40)
- typename = "アイコンボタン型";
- else if (metaId == MJ_TICONL40)
- typename = "トグルアイコン型";
- else if (metaId == MJ_MITEML40)
- typename = "メニューアイテム型";
- else if (metaId == MJ_SCRLL40)
- typename = "スクロールバー型";
- else if (metaId == MJ_TEXTL40)
- typename = "テキスト型";
- else if (metaId == MJ_LMENUL40)
- typename = "リストメニュー型";
- else if (metaId == MJ_NUMBOXL40)
- typename = "数値入力パネル型";
- else
- typename = "<不明>";
- return typename;
- }
-
- /*--------------------------------------------------------*/
- /* ファイルダイアログの見た目を変更する */
- /*--------------------------------------------------------*/
-
- #if 0
- static void FDGdump(void)
- {
- int idWin;
- idWin = FDG_GetMainID();
- int depth = 0;
- void dumpObj(int id)
- {
- void indent(void)
- {
- int i;
- for (i=0; i<depth; i++)
- printf("| ");
- }
- OBJECT *pObj, *pBase;
- if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
- { printf("*** no there %d ***\n",id); return; }
- pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
- indent();
- printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
- HYPER hyp;
- hyp = *(HYPER*)pObj->data;
- indent();
- printf("│ fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
- hyp.fr.rdwx, hyp.fr.rdwy);
- printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
- indent();
- printf("└ base,slave,left,right=(%d,%d,%d,%d)\n",
- pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
- if (pObj->slave > 0)
- { depth++; dumpObj(pObj->slave); depth--; }
- if (pBase != NULL)
- if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
- dumpObj(pObj->llevel);
- }
- dumpObj(idWin);
- }
- #endif
-
- #if 1
- void FDGdump(void)
- {
- int idWin;
- idWin = MJ_BASEOBJ;
- int depth = 0;
- void dumpObj(int id)
- {
- if (depth >= 2)
- return;
- void indent(void)
- {
- int i;
- for (i=0; i<depth; i++)
- printf("| ");
- }
- OBJECT *pObj, *pBase;
- if (id <= 0 || (pObj = TL_getObjectPtr(id)) == NULL)
- { printf("*** no there %d ***\n",id); return; }
- pBase = (pObj->base > 0 ? TL_getObjectPtr(pObj->base) : NULL);
- indent();
- printf("┌Obj %4d %-20s\n", id,RM_getMetaIdName(pObj->meta));
- HYPER hyp;
- hyp = *(HYPER*)pObj->data;
- indent();
- printf("│ fr(%3d,%3d)-(%3d,%3d) ", hyp.fr.lupx, hyp.fr.lupy,
- hyp.fr.rdwx, hyp.fr.rdwy);
- printf("col(%d,%d,%d)\n", hyp.clr.fr, hyp.clr.back, hyp.clr.ch);
- indent();
- printf("└ base,slave,left,right=(%d,%d,%d,%d)\n",
- pObj->base,pObj->slave,pObj->llevel,pObj->rlevel);
- if (pObj->slave > 0)
- { depth++; dumpObj(pObj->slave); depth--; }
- if (pBase != NULL)
- if (pObj->llevel > 0 && pObj->llevel != pBase->slave)
- dumpObj(pObj->llevel);
- }
- dumpObj(idWin);
- }
- #endif
-
- void RM_setFileDlgStyle(int style)
- {
- typedef struct
- {
- int objId;
- COLOR clr; /* 設定したい表示色 */
- int atrm; /* 設定したい表示属性 */
- FRAME fr; /* フレーム変更(相対値) */
- } PARTCHANGE;
- static PARTCHANGE change[] =
- {
- #define FR0 {0,0,0,0}
- #define STYLE {BLACK,WINBACK,BLACK}, MS_FRAMEL40|MS_UFRAMEL40
- #define STYLE2 {BLACK,BLACK,WHITE}, MS_FRAMEL40|MS_DFRAMEL40
- #define STYLE3 {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_UFRAMEL40
- #define STYLE4 {BLACK,WINBACK,WINBACK}, MS_FRAMEL40|MS_BFRAMEL40|MS_PANELL40
- #define BK BLACK
- #define MSGSTYLE2 {BK,WINBACK,BK},MS_OPAQUEL40
- { FDG_MAINDLG, STYLE, FR0 },
- { FDG_TITLE1, STYLE, {1,1,1,0} },
- { FDG_TITLE2, STYLE, {1,1,1,0} },
- { FDG_TITLEMSG, MSGSTYLE2,{1,1,1,1} },
- { FDG_CLSBTN, STYLE3, {0,0,2,2} },
- { FDG_DRVSLCTL, STYLE, FR0 }, // ドライブ選択←
- { FDG_DRVSLCTR, STYLE, FR0 }, // ドライブ選択→
- { FDG_DRVICON, STYLE, FR0 },
- { FDG_ALLDRVBTN,STYLE, FR0 }, // SHOW ALL 背景
- { FDG_ALLDRVDLG,STYLE, FR0 }, // SHOW ALL 背景
- { FDG_VOLLABEL, MSGSTYLE2,FR0 },
- { FDG_FREESIZE, MSGSTYLE2,FR0 },
- { FDG_CURDIR, STYLE2, FR0 },
- { FDG_MOVEDIR, STYLE, FR0 },
- { FDG_UPDIR, STYLE, FR0 },
- { FDG_LMENU, STYLE2, FR0 },
- { FDG_SCRLBAR, STYLE4, FR0 },
- { FDG_FNAMETXT, {RED,BK,WHITE},MS_FRAMEL40|MS_DFRAMEL40, FR0 },
- { FDG_EXECBTN, STYLE, FR0 },
- { FDG_CNCLBTN, STYLE, FR0 },
- { -1 }
- };
- PARTCHANGE *pc;
- for (pc = change; pc->objId >= 0; pc++)
- {
- HYPER hyp;
- FDG_GetObjData(pc->objId, &hyp);
- hyp.atrm = pc->atrm;
- hyp.clr = pc->clr;
- hyp.fr.lupx += pc->fr.lupx;
- hyp.fr.lupy += pc->fr.lupy;
- hyp.fr.rdwx += pc->fr.rdwx;
- hyp.fr.rdwy += pc->fr.rdwy;
- FDG_SetObjData(pc->objId, &hyp);
- }
- }
-
- /*--------------------------------------------------------*/
- /* ダイアログ実行 */
- /*--------------------------------------------------------*/
-
- void RM_execDialog(int idDlg, int idAlertAttachHyp, int idSelectiveHyp)
- {
- WINCLIP* clipStack;
- RM_setClipVisibleAllScr();
- RM_setOriginZero();
- RM_moveCenter(idDlg);
- MTL_setFlagObj(idSelectiveHyp, MS_UNSELECT) ;
- MMI_SendMessage(idDlg, MM_ATTACH, 1, idAlertAttachHyp);
- MMI_SendMessage(idDlg, MM_SHOW, 0);
- MMI_ExecSystem();
- MMI_SendMessage(idDlg, MM_ERASE, 0);
- MMI_SendMessage(idDlg, MM_DETACH, 0);
- MTL_resetFlagObj(idSelectiveHyp, ~MS_UNSELECT) ;
- RM_recoverOrigin();
- RM_recoverClipVisible();
- }
-
- /*--------------------------------------------------------*/
- /* オリジナル・ビジュアルエフェクト関数 */
- /*--------------------------------------------------------*/
-
- void MS_ve(int num, int flag, FRAME *fr, char *ptr)
- {
- if (flag == TRUE)
- {
- int ve = (num / 100) % 100;
- if (num == 9)
- /* 斜め線転送! 今は16色モードのみ。*/
- {
-
- }
- }
- else
- {
- int ve = num % 100;
- }
- }
-
- int RM_getObjFromPoint(POINT* pt)
- {
- EVENT ev;
- ev.what = EVMOSMOVE;
- ev.shift = 0;
- ev.info = *(int*)pt;
- ev.data = 0;
- ev.time = 0;
- int id = MMI_SendMessage(MJ_BASEOBJ, MM_ONPARTS,1, &ev);
- return id;
- }
-
- int RM_getObjWhereIs(int x,int y)
- {
- POINT pt = {x,y};
- return RM_getObjFromPoint(&pt);
- }
-
- void RM_getScreenSize(int *wid, int *ht)
- {
- WINCTRL* ctrl;
- MMI_GetControl(&ctrl);
- if (wid != NULL)
- *wid = ctrl->bound.rdwx+1;
- if (ht != NULL)
- *ht = ctrl->bound.rdwy+1;
- }
-
- /*--------------------------------------------------------*/
- /* TIFFファイル関連 */
- /*--------------------------------------------------------*/
-
- #include <tifflib.h>
-
- #define DATABUF (32*1024)
- #define IMAGEBUF (16*1024)
- #define WORKBUF _max(DECOMP_WORK_SIZE,COMP_WORK_SIZE)
-
- static char *tiff_databuf = NULL;
- static char *tiff_imagebuf = NULL;
- static char *tiff_workbuf = NULL;
- static int tiff_wid,tiff_ht;
- static FILE *tiff_fp;
-
- static int RM_initTIFFwork(void)
- // 返値 0=正常終了 -1=メモリ不足
- {
- if (tiff_databuf == NULL) { // 作業用メモリ領域の確保
- if ((tiff_databuf = TL_calloc(1,DATABUF+IMAGEBUF+WORKBUF)) == NULL)
- return -1;
- tiff_imagebuf = tiff_databuf + DATABUF;
- tiff_workbuf = tiff_imagebuf + IMAGEBUF;
- }
- return 0;
- }
-
- static void RM_freeTIFFwork(void)
- {
- if (tiff_databuf != NULL)
- TL_free(tiff_databuf);
- tiff_databuf = NULL;
- }
-
- static int _RM_readTiffFile(char *buf, int size)
- {
- fread(buf,1,size,tiff_fp);
- return 0;
- }
-
- int RM_loadTIFF(char *fname,
- int funcPutImage(char *buf, int ofsy, int ht),
- int funcSetPalette(char *buf, int pltnum))
- // 返値 NOERR=成功 TIFFERR..=失敗
- {
- if (RM_initTIFFwork() != 0)
- return TIFFERR_NOMEMORY;
- tiff_fp = NULL;
- int ret = NOERR;
- if ((tiff_fp = fopen(fname, "rb")) == NULL)
- { ret = TIFFERR_CANNOTOPEN; goto CLOSE; }
- // ヘッダを読み込み、画像に関するパラメータを得る
- fread(tiff_databuf, 1, DATABUF, tiff_fp);
- if (TIFF_getHead(tiff_databuf, DATABUF) < 0)
- { ret = TIFFERR_INVALIDFORMAT; goto CLOSE; }
- int pixelsize; // 画像のピクセルサイズ
- int comp; // 圧縮のある・なし
- int fill;
- long strip;
- long clut; // CLUT(パレット情報)のある・なし
- pixelsize = TIFF_checkMode(&tiff_wid,&tiff_ht,&comp,&fill,&strip,&clut);
- if (pixelsize < 0)
- { ret = TIFFERR_INVALIDFORMAT; goto CLOSE; }
- // 入出力関数の設定
- TIFF_setLoadFunc(funcPutImage, _RM_readTiffFile);
- // CLUTデータがある場合、パレットを設定する
- if (clut != 0)
- {
- char plt[256*8+4];
- int pltnum = TIFF_getPal(plt);
- if (funcSetPalette != (int(*)())0)
- funcSetPalette(plt, pltnum);
- }
- // 読み込みバッファに格納可能な縦横のドット数を得る
- int buf_wid = (pixelsize==4 ? ((tiff_wid+7) & 0xfffffff8) : tiff_wid);
- int buf_ht = IMAGEBUF / ((buf_wid * pixelsize + 7) / 8);
- // 画像をロードする
- TIFF_loadImage(pixelsize, tiff_wid, tiff_ht, strip, fill, comp,
- tiff_imagebuf, buf_wid, buf_ht, tiff_workbuf);
- CLOSE:
- if (tiff_fp != NULL)
- fclose(tiff_fp);
- RM_freeTIFFwork();
- return ret;
- }
-
- static int _RM_writeTiffFile(char *buf, long size)
- {
- if (fwrite(buf,1,size,tiff_fp) < size)
- return -1;
- return 0;
- }
-
- int RM_saveTIFF(char *fname,int pixelsize,int wid,int ht,
- BOOL fComp,
- int funcGetImage(char *buf,int ofsy,int ht),
- int funcGetPalette(char *buf))
- // 返値 0=成功 -1=画面モード/ファイル名の間違い
- // -2=メモリ不足 -3=ディスク領域不足 -4=get関数エラー
- {
- if (RM_initTIFFwork() != 0)
- return TIFFERR_NOMEMORY;
- tiff_fp = NULL;
- int ret = NOERR;
- // ファイルをオープン
- if ((tiff_fp = fopen(fname,"wb")) == NULL)
- { ret = TIFFERR_CANNOTOPEN; goto CLOSE; }
- // パレット情報を得る
- char paletbuf[256*8+4];
- int paletnum = 0;
- if (funcGetPalette != (int(*)())0)
- paletnum = funcGetPalette(paletbuf);
- int headsize = (paletnum == 256 ? 2048 : 512);
- // ヘッダのサイズ分だけシーク
- if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
- { ret = TIFFERR_NODISKSPACE; goto CLOSE; }
- // データ入出力処理の登録
- TIFF_setSaveFunc(_RM_writeTiffFile, funcGetImage);
- // 画像をセーブし、圧縮後のデータサイズを得る
- int imagebuf_wid = (pixelsize==4? ((wid+7)&0xfffffff8) : wid);
- int imagebuf_ht = IMAGEBUF / ((imagebuf_wid*pixelsize+7)/8);
- int cmp_size;
- cmp_size = TIFF_saveImage(pixelsize, wid, ht, (fComp? 5:1),
- tiff_databuf, DATABUF,
- tiff_imagebuf,imagebuf_wid,imagebuf_ht,tiff_workbuf);
- if (cmp_size == -1)
- { ret = TIFFERR_OTHERS; goto CLOSE; }
- else if (cmp_size == -2)
- { ret = TIFFERR_NODISKSPACE; goto CLOSE; }
- // ヘッダ情報をつくる
- TIFF_setHead(tiff_databuf, pixelsize, wid,ht, (fComp? cmp_size:0),
- (paletnum > 0 ? paletbuf : NULL));
- // ヘッダを書き出し、クローズ
- fflush(tiff_fp);
- long nowfp = ftell(tiff_fp);
- rewind(tiff_fp);
- if (fwrite(tiff_databuf,1,headsize,tiff_fp) < headsize)
- { ret = TIFFERR_NODISKSPACE; goto CLOSE; }
- fflush(tiff_fp);
- fseek(tiff_fp,nowfp,SEEK_SET);
- CLOSE:
- if (tiff_fp != NULL)
- fclose(tiff_fp);
- RM_freeTIFFwork();
- return ret;
- }
-
- int RM_getTIFFinfo(char *fname, TIFFINFO *info)
- // 返値 0=正常終了
- // -1=ファイルが存在しない
- // -2=TIFF形式ではない
- // -3=メモリが足りない
- {
- if (RM_initTIFFwork() != 0)
- return TIFFERR_NOMEMORY;
- int ret = NOERR;
- if ((tiff_fp = fopen(fname,"rb")) == NULL)
- { ret = TIFFERR_CANNOTOPEN; goto END; }
- fread(tiff_databuf,1,DATABUF,tiff_fp);
- fclose(tiff_fp);
- if (TIFF_getHead(tiff_databuf,DATABUF) < 0)
- { ret = TIFFERR_INVALIDFORMAT; goto END; }
- int xlen,ylen,pixelsize,comp,fill; long strip,clut;
- if ((pixelsize = TIFF_checkMode(&xlen,&ylen,&comp,&fill,&strip,&clut)) < 0)
- { ret = TIFFERR_INVALIDFORMAT; goto END; }
- info->wid = xlen;
- info->ht = ylen;
- info->compress = (comp == 1 ? FALSE : TRUE);
- info->pixelsize = pixelsize;
- END:
- RM_freeTIFFwork();
- return ret;
- }
-